package jus.poc.prodcons.v6;

import java.io.PrintStream;
import jus.poc.prodcons.Acteur;
import jus.poc.prodcons.Aleatoire;
import jus.poc.prodcons.ControlException;
import jus.poc.prodcons.Message;
import jus.poc.prodcons.Observateur;
import jus.poc.prodcons._Consommateur;

/**
 * Le Consommateur est la structure consommatrice de ressources de notre modèle.
 *
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class Consommateur extends Acteur implements _Consommateur {
	protected int consommes;
	protected ProdCons tampon;
	protected int id;

	protected Consommateur(int type, Observateur observateur,
			int moyenneTempsDeTraitement, int deviationTempsDeTraitement)
			throws ControlException {
		super(type, observateur, moyenneTempsDeTraitement, deviationTempsDeTraitement);
		consommes = 0;
	}
	
	/**
	 * le constructeur
	 * @param observateur
	 * @param moyenneTempsDeTraitement
	 * @param deviationTempsDeTraitement
	 * @param tampon
	 * @param i
	 * Le numero du consommateur
	 * @throws ControlException
	 */
	public Consommateur(Observateur observateur,
			int moyenneTempsDeTraitement, int deviationTempsDeTraitement,ProdCons tampon,int i) throws ControlException {
		this(typeConsommateur, observateur, moyenneTempsDeTraitement, deviationTempsDeTraitement);
		this.tampon=tampon;
		id = i;
	}

	@Override
	public int nombreDeMessages() {
		return consommes;
	}

	@Override
	public void run() {
		while (true) {
			Aleatoire alea = new Aleatoire(moyenneTempsDeTraitement, deviationTempsDeTraitement);
			try {
				sleep(alea.next());
				int delay = alea.next();
				Message m = tampon.get(this);

				((MessageX)m).setConso(this.toString());
				sleep(delay);
				observateur.consommationMessage(this, m, delay);
				
				print(System.out,m.toString());
				consommes++;
			} catch (InterruptedException e) {
			} catch (Exception e) {
			}
		}
	}
	
	/**
	 * Imprime le message dans out
	 * @param out
	 * @param message
	 */
	private void print(PrintStream out,String message) {
		out.println(message);
	}

	@Override
	public String toString() {
		return "Conso"+id;
	}

	/**
	 * Permet de declarer a l'observateur un retrait du message m par le consommateur en cours
	 * @param m
	 * Le message retire
	 * @throws InterruptedException
	 */
	public void retraitMessage(Message m) throws InterruptedException, ControlException {
		observateur.retraitMessage(this, m);
	}
	
}
